package thread.noteplusss;

import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

/**
 * 聊天室的客户端
 *
 <<<<<<< Updated upstream
 * V3版的客户端start方法中的主要逻辑是先等待用户在控制台上输入一行字符串,然后将其发送给服务端后再读取
 * 来自服务端发送过来的消息.
 * 但是由于V4服务器已经改成了可以将其他客户端的消息也转发给所有有客户端的操作,这会导致有源源不断的新消息
 * 发送给客户端,然后如果客户端必须先等待用户输入一行再接收一行来自服务端消息的话,会导致接收消息不畅问题.
 *
 * 为了解决这个问题:
 * 我们应当将发送消息和接收消息的操作分别在不同的线程上运行,才能做到互不干涉.
 *
 * 实现:
 * 我们将发送消息还定义在start方法中由客户端的主线程执行即可,将读取消息单独定义到一个线程上执行
 * 1:定义内部类ServerHandler,这是一个线程任务,主要工作就是读取来自服务端发送的消息并输出到客户端的
 *   控制台上
 * 2:在start方法一开始就启动一个线程来执行ServerHandler这个任务,不断接收来自服务端的消息.
 *
 =======
 * 此版本对应Server的第三个版本的改造
 * 添加读取来自服务端发送过来的消息并输出到客户端控制台上
 * 实现:
 * 1:在start方法中通过socket获取输入流并进行流连接为BufferedReader
 * 2:每当我们发送给服务端一行字符串后就读取来自服务端发送过来的一行字符串
 *   因为服务端那边是读取到客户端发送的一行字符串就将其回复给客户端了
 >>>>>>> Stashed changes
 *
 *
 */
@SuppressWarnings("all")
public class Client2 {
    private Socket socket;
    public Client2(){
        try {
            System.out.println("正在链接");
            socket= new Socket("yjpyjp",8080);//127.0.0.1 //176.17.9.39
            System.out.println("连接成功");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void start(){
        try {
            Thread thread = new Thread(new ServerHandler());
            thread.start();
            OutputStream outputStream = socket.getOutputStream();
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8);
            BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
            PrintWriter printWriter = new PrintWriter(bufferedWriter,true);
            Scanner scanner = new Scanner(System.in);
            while (true){
                System.out.printf("发送消息:");
                String next = scanner.nextLine();
                if ("exit".equals(next)){
                    break;
                }
                printWriter.println(next);

            }
        } catch (IOException e) {
            e.printStackTrace();
        }  finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }

    public static void main(String[] args){
        Client2 client = new Client2();
        client.start();

    }
    public class ServerHandler implements Runnable{
        @Override
        public void run() {
            try {
                InputStream in = socket.getInputStream();//输入流
                InputStreamReader isr = new InputStreamReader(in,"UTF-8");//以utf-8读
                BufferedReader br = new BufferedReader(isr);
                String message = null;
                while((message=br.readLine())!=null) {
                    System.out.println(message);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

    }




}
